let utils = {};

utils.isMobile = function(val) {
  return val && (/^1[3456789]\d{9}$/i.test(val));
}
utils.isEmail = function(email) {
  const reg =
    /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  return reg.test(email)
  // return val && (/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/i.test(val));
}
utils.isIdCard = function(val) {
  return val && (/^[1-9]\d{5}(19\d{2}|[2-9]\d{3})((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])(\d{4}|\d{3}X)$/i.test(val));
}

let validatorEmail = (rule, value, callback) => {
  if (!value) {
    return callback();
  }
  if (utils.isEmail(value)) {
    return callback();
  }
  // callback(new Error('请输入正确的邮箱号码'));
  callback(new Error('请检查邮箱地址是否正确'));
};
let validatorMobile = (rule, value, callback) => {
  if (!value) {
    return callback();
  }
  if (utils.isMobile(value)) {
    return callback();
  }
  // callback(new Error('请输入正确的手机号'));
  callback(new Error('请检查号码是否正确'));
};
let validatorPhone = (rule, value, callback) => {
  if (!value) {
    return callback();
  }
  if (/^(0\d{2,3}-?|\(0\d{2,3}\))?[1-9]\d{4,7}(-\d{1,8})?$/i.test(value)) {
    return callback();
  }
  callback(new Error('请检查号码是否正确'));
};

const validatorPostcode = (rule, value, callback) => {
  if (!value) {
    return callback();
  }
  // if (/^[1-9]\d{5}(?!\d)$/g.test(value))
  if (/^[1-9]\d{5}$/i.test(value)) {
    return callback();
  }
  // callback(new Error('请输入正确的电话号码'));
  callback(new Error('请检查号码是否正确'));
};

let validatorIdCard = (rule, value, callback) => {
  if (!value) {
    return callback();
  }
  if (utils.isIdCard(value)) {
    return callback();
  }
  // callback(new Error('请输入正确的证件号码'));
  callback(new Error('请检查号码是否正确'));
};

let validatorAge = (rule, value, callback) => {

  if (value === undefined || value === null) {
    return callback();
  }

  let age = Number(value);
  if (Number.isNaN(age) || !Number.isFinite(age)) {
    return callback(new Error('请检查年龄是否正确'));
  }
  if (age < 20 || age > 90) {
    return callback(new Error('请检查年龄是否正确'));
  }
  callback();
};

// 验证密码   密码，以字母开头，长度在8~18之间，只能包含字母、数字和下划线
function isValidPass(str) {
  const reg = /^[a-zA-Z]\w{8,18}$/;
  return reg.test(str);
}

function isValidUsername(str) {
  //   验证用户名  用户名要求 数字、字母、下划线的组合，其中数字和字母必须同时存在*
  // const reg = /^(?![^A-Za-z]+$)(?![^0-9]+$)[0-9A-Za-z_]{3,15}$/;
  //   验证用户名  数字、字母、下划线的组合，字母开头，长度不小于4
  const reg = /^[a-zA-Z]{1}[0-9A-Za-z_]{3,15}$/;
  return reg.test(str);
}

function validatorUsername(rule, value, callback) {
  if (!value || isValidUsername(value)) {
    return callback();
  }
  // const valid_map = ['admin', 'editor']
  // return valid_map.indexOf(str.trim()) >= 0
  callback(new Error('要求数字、字母、下划线的组合，字母开头，长度不小于4'));
}

// 验证中文姓名
let checkRealName = (rule, value, callback) => {
  //验证名字的正则表达式
  const realnameReg = /^[\u4E00-\u9FA5]{2,6}$/
  if (!value) {
    return callback(new Error('请输入真实姓名'))
  }
  setTimeout(() => {
    if (!realnameReg.test(value)) {
      return callback(new Error('请输入2-6个汉字'))
    } else {
      callback()
    }
  }, 100)
}

let validatorPwd = (rule, value, callback) => {
  var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{6,99}');
  if (!value || pwdRegex.test(value)) {
    return callback();
  }
  callback(new Error('密码复杂度过低，必须包含字母、数字、特殊字符，至少6个字符'));
};
const validatorUrl = (rule, value, callback) => {

  if (!value) {
    return callback();
  }
  try {
    // tslint:disable-next-line: no-unused-expression
    new URL(value)
  } catch (err) {
    return callback(new Error('请检查网址是否正确'));
  }
  callback();
};

let notEmpty = {
  required: true,
  message: '不能为空',
  trigger: 'blur'
};

let formRules = {
  notEmpty,
  required: notEmpty,
  username:  {
    trigger: 'blur',
    validator: validatorUsername //注册修改时使用
  },
  name: notEmpty,
  realname: notEmpty,
  gender: notEmpty,
  account: notEmpty, //注册修改时使用
  password: {
    trigger: 'blur',
    validator: validatorPwd //注册修改时使用
  },
  age: {
    trigger: 'blur',
    validator: validatorAge
  },
  mobile: {
    trigger: 'blur',
    validator: validatorMobile
  },
  phone: {
    trigger: 'blur',
    validator: validatorPhone
  },
  idCard: {
    trigger: 'blur',
    validator: validatorIdCard
  },
  email: {
    trigger: 'blur',
    validator: validatorEmail
  },
  // 邮编
  postcode: {
    trigger: 'blur',
    validator: validatorPostcode
  },
  url: {
    trigger: 'blur',
    validator: validatorUrl
  },
}

export default formRules